package com.kaifa.org.tp03.example01.proxy;

import com.kaifa.org.tp03.example01.aspect.AopAspect;
import com.kaifa.org.tp03.example01.dao.OrderDao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * jdk代理
 */
public class JdkProxy implements InvocationHandler {
//    声明接口
    private OrderDao orderDao;

    /**
     * 创建代理
     * @param orderDao 接口类
     * @return
     */
    public Object createProxy(OrderDao orderDao){
        this.orderDao=orderDao;
//        进行加载,类的加载器
        ClassLoader classLoader=JdkProxy.class.getClassLoader();
//        处理接口
        Class[] classes=orderDao.getClass().getInterfaces();
//        返回代理对象
        Object obj=Proxy.newProxyInstance(classLoader,classes,this);
        return obj;
    }

    /**
     * 所有的动态代理类，都会通过invoke方法进行处理
     * @param proxy 被代理的对象
     * @param method 将要被执行的方法
     * @param args 执行方法中的参数
     * @return 对象
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//        创建切面对象（类）
        AopAspect aopDispose = new AopAspect();
//        调用其中的增强方法
        aopDispose.checkPermission();
//        处理接口orderDao中的方法，并传入参数args
        Object object=method.invoke(orderDao,args);
//        记录日志
        aopDispose.log();

        return object;
    }
}
